前言
在golang中,常见的序列型数据类型有array和slice这两种,但array因为其固定长度的限制,在实际使用中用得不多,slice则更为常用。下面简单介绍和对比一下这两种相似却又有很多差异的数据类型。
Array:
概念:
在golang中,数组由相同类型的元素组成的具有固定长度的一种序列型复合数据类型。
声明和使用:
1 | package main |
总结
在golang中array的长度是固定的,声明时必须以数值形式明确指定或者以’…’形式间接指定元素长度,且不同的长度的array类型不同不能转换,因此使用场景有限。
Slice
概念
在golang中,数组由相同类型的元素组成的可变长度的一种序列型复合数据类型。在理解上来说,slice和array唯一的区别是长度可变
声明和使用
1 | package main |
Slice说明
1.声明一个空slice,默认len和cap的值都为0。声明长度为0的array的方式: var b [0]int,这两者声明方式非常相似
2.slice在新增元素的时候,如果len超过cap,会动态扩容cap,根据网上查到的扩容函数的源码:
1 | func growslice(et *_type, old slice, cap int) slice { |
可概括扩容策略如下:
当cap小于len时启动扩容,若cap < 1024,则申请新的内存cap翻倍,若大于2014,则cap提升1/4。(这与python的list扩容策略很相似)
3.使用make方式声明可以指定cap以直接申请一块连续的内存空间,避免频繁地改变cap容量而带来额外的开销。
4.copy函数复制slice时,假设源slice长度为x,目标slice长度为y,则覆盖策略为:
如果 x<y,则用源slice的所有元素逐个覆盖目标slice的前x个元素;
如果 x>y,则用源slice前y个元素逐个覆盖目标slice的所有元素。